%{
#include "portal.h"
#include <string.h>
int linesCounter = 1;

%}


letra [a-z]
texto	"\""[^\'\n]*"\""

delimitador_ponto_virgula ";"
delimitador_virgula ","
delimitador_ponto "."
delimitador_parenteses_a "("
delimitador_parenteses_f ")"
delimitador_colchetes_a "["
delimitador_colchetes_f "]"
delimitador_dois_pontos ":"

sinal "+"|"-"
digito [0-9]
inteiro_sem_sinal ({digito})+
real_sem_sinal ({digito})+"."({digito})+
operador_adicao "+"
operador_sub "-"
operador_multi "*"
operador_divisao "/"
operador_e "E"
operador_ou "OU"
operador_nao "NAO"
operador_div "DIV"
operador_mod "MOD"
operador_menor "<"
operador_maior ">"
operador_igual "="
operador_dif "<>"
operador_maior_igual ">="
operador_menor_igual "<="
operador_atribuicao ":="

identificador	{letra}({letra}|{digito})*

%%

programa {
	yylval.stringValue = strdup(yytext);
	return T_PROGRAMA;
}

inteiro {
	yylval.stringValue = strdup(yytext);
	return T_IDENTIFICADOR;
}

repita {
	yylval.stringValue = strdup(yytext);
	return T_REPITA;
}

tipo {
	yylval.stringValue = strdup(yytext);
	return T_TIPO;
}

packed {
	yylval.stringValue = strdup(yytext);
	return T_PACKED;
}

registro {
	yylval.stringValue = strdup(yytext);
	return T_REGISTRO;
}

procedimento {
	yylval.stringValue = strdup(yytext);
	return T_PROCEDIMENTO;
}

funcao {
	yylval.stringValue = strdup(yytext);
	return T_FUNCAO;
}

texto {
	yylval.stringValue = strdup(yytext);
	//printf("Texto\n");
	return T_TEXTO;
}

de {
	yylval.stringValue = strdup(yytext);
	//printf("%s ", yytext);
	return T_DE;
}

var {
	yylval.stringValue = strdup(yytext);
	return T_VAR;
}

matriz {
	yylval.stringValue = strdup(yytext);
	return T_MATRIZ;
}

arquivo {
	yylval.stringValue = strdup(yytext);
	return T_ARQUIVO;
}

faca {
	yylval.stringValue = strdup(yytext);
	//printf("%s ", yytext);
	return T_FACA;
}

atribuir {
	yylval.stringValue = strdup(yytext);
	return T_ATRIBUIR;
}

senao {
	yylval.stringValue = strdup(yytext);
	return T_SENAO;
}


decrementa {
	yylval.stringValue = strdup(yytext);
	return T_DECREMENTA;
}

incrementa {
	yylval.stringValue = strdup(yytext);
	return T_INCREMENTA;
}

inicio {
	yylval.stringValue = strdup(yytext);
	//printf("t_%s ", yytext);
	return T_INICIO;
}

fim {
	yylval.stringValue = strdup(yytext);
	//printf("t_fim ");
	return T_FIM;
}

se {
	yylval.stringValue = strdup(yytext);
	return T_SE;
}

entao {
	yylval.stringValue = strdup(yytext);
	return T_ENTAO;
}

enquanto {
	yylval.stringValue = strdup(yytext);
	//printf("%s ", yytext);
	return T_ENQUANTO;
}

ate {
	yylval.stringValue = strdup(yytext);
	return T_ATE;
}

para {
	yylval.stringValue = strdup(yytext);
	return T_PARA;
}

constante {
	yylval.stringValue = strdup(yytext);
	return T_CONSTANTE;
}

{sinal} {
	yylval.stringValue = strdup(yytext);
	return T_SINAL;
}


"{"[^}\n]*"}" {
	//printf( "Comentário\n");
}

" " {
	/*printf("Espaço em branco\n");*/
}

\n {
	/*printf("Nova Linha\n");*/
	linesCounter++;
}

\t  {
	/*printf("tabulacao\n");*/
}


{delimitador_ponto_virgula} {
	//printf("\nT_Ponto_Virgula");
	return T_PONTO_VIRGULA;
}
{delimitador_virgula} {
	yylval.stringValue = strdup(yytext);
	return T_VIRGULA;
}
{delimitador_ponto} {
	return T_PONTO;
}
{delimitador_parenteses_a} {
	return T_PARENTESES_A;
}
{delimitador_parenteses_f} {
	return T_PARENTESES_F;
}
{delimitador_colchetes_a} {
	yylval.stringValue = strdup(yytext);
	return T_COLCHETE_A;
}
{delimitador_colchetes_f} {
	yylval.stringValue = strdup(yytext);
	return T_COLCHETE_F;
}
{delimitador_dois_pontos} {
	//printf("%s", yytext);
	return T_DOIS_PONTOS;
}


{inteiro_sem_sinal} {
	yylval.stringValue = strdup(yytext);
	//printf("inteiro: %s ", yytext);
	return T_INTEIRO_SEM_SINAL;
}

{real_sem_sinal} {
	yylval.stringValue = strdup(yytext);
	//printf("real: %s ", yytext);
	return T_REAL_SEM_SINAL;
}

{texto} {
	yylval.stringValue = strdup(yytext);
	//printf("Texto %s ", yytext);
	return T_TEXTO;
}

{operador_adicao} {
	return T_OP_ADICAO;
}
{operador_sub} {
	return T_OP_SUBTRACAO;
}
{operador_multi} {
	return T_OP_MULTIPLICACAO;
}
{operador_divisao} {
	return T_OP_DIVISAO;
}
{operador_e} {
	return T_OP_E;
}
{operador_ou} {
	return T_OP_OU;
}
{operador_nao} {
	return T_OP_NAO;
}
{operador_div} {
	return T_OP_DIV;
}
{operador_mod} {
	return T_OP_MOD;
}
{operador_menor} {
	return T_OP_MENOR;
}
{operador_maior} {
	return T_OP_MAIOR;
}
{operador_igual} {
	return T_OP_IGUAL;
}
{operador_dif} {
	return T_OP_DIFERENTE;
}
{operador_maior_igual} {
	return T_OP_MAIORIGUAL;
}
{operador_menor_igual} {
	return T_OP_MENORIGUAL;
}
{operador_atribuicao} {
	return T_OP_ATRIBUICAO;
}

{identificador} {
	//printf("IDENTIFICADOR: %s\n",yytext);
	yylval.stringValue = strdup(yytext);
	//printf("Id %s ", yytext);
	return T_IDENTIFICADOR;
}

%%


/*
int main(int argc, char **argv) {
	++argv;
	--argc;
	
	if (argc > 0) {
		yyin = fopen(argv[0], "r");
	}
	else {
		yyin = stdin;
	}
	yylex();
	printf("\nNumero de linhas: %d\n\n", linesCounter);
	
	return 0;
}
*/
